﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace DataTier
{
    [Serializable]
    public class RawKlagesagData
    {
        private RawKlagesagData()
        {

        }

        private string ejerFirma;

        public string EjerFirma
        {
            get { return ejerFirma; }
            set { ejerFirma = value; }
        }

        private string coEjer;

        public string CoEjer
        {
            get { return coEjer; }
            set { coEjer = value; }
        }

        private string ejerPostNr;

        public string EjerPostNr
        {
            get { return ejerPostNr; }
            set { ejerPostNr = value; }
        }

        private string ejerBy;

        public string EjerBy
        {
            get { return ejerBy; }
            set { ejerBy = value; }
        }
        private string title;

        public string Title
        {
            get { return title; }
            set { title = value; }
        }
        private string ejerKontakt;

        public string EjerKontakt
        {
            get { return ejerKontakt; }
            set { ejerKontakt = value; }
        }
        private string kundeTelefon;

        public string KundeTelefon
        {
            get { return kundeTelefon; }
            set { kundeTelefon = value; }
        }
        private string ejerEmail;

        public string EjerEmail
        {
            get { return ejerEmail; }
            set { ejerEmail = value; }
        }
        private int potentiale;

        public int Potentiale
        {
            get { return potentiale; }
            set { potentiale = value; }
        }

        private RawSagsType sagsType;

        public RawSagsType SagsType
        {
            get { return sagsType; }
            set { sagsType = value; }
        }

        private string bemærkning;

        public string Bemærkning
        {
            get { return bemærkning; }
            set { bemærkning = value; }
        }

        private int gammelt_Klagesagsnr;

        public int Gammelt_Klagesagsnr
        {
            get { return gammelt_Klagesagsnr; }
            set { gammelt_Klagesagsnr = value; }
        }

        public static RawKlagesagData Load(int klagesagsnr, string connStr)
        {
            var toReturn = new RawKlagesagData();
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    var sqlStr = "SELECT Ejer_Firma,[co/ejer],Ejer_Postnr,Ejer_By,Titel,Ejer_Kontakt,Kunde_Telefon,Ejer_Email,Potentiale,Sagstype,Bemærkning FROM dbo.KlageSag where [Gammelt_Klagesagsnr] = " + klagesagsnr;
                    var sqlCommand = new SqlCommand(sqlStr, conn);
                    var sqlReader = sqlCommand.ExecuteReader();

                    //|Ejer_Firma|Co/ejer|Ejer_Post nr|Ejer_By|Titel|Ejer_Kontakt|Kunde_Telefon|Ejer_Email|Potentiale|Sagstype|Bemærkning|

                    if (sqlReader.Read())
                    {
                        toReturn.gammelt_Klagesagsnr = klagesagsnr;
                        toReturn.ejerFirma = getNullableString(sqlReader, 0);
                        toReturn.coEjer = getNullableString(sqlReader, 1);
                        toReturn.ejerPostNr = getNullableString(sqlReader, 2);
                        toReturn.ejerBy = getNullableString(sqlReader, 3);
                        toReturn.title = getNullableString(sqlReader, 4);
                        toReturn.ejerKontakt = getNullableString(sqlReader, 5);
                        toReturn.kundeTelefon = getNullableString(sqlReader, 6);
                        toReturn.ejerEmail = getNullableString(sqlReader, 7);
                        toReturn.potentiale = getNullableInt(sqlReader, 8);
                        toReturn.sagsType = (RawSagsType)Enum.ToObject(typeof(RawSagsType), getNullableInt(sqlReader, 9));
                        toReturn.bemærkning = getNullableString(sqlReader, 10);
                    }
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                    throw new ArgumentException("Could not be found " + klagesagsnr + Environment.NewLine + " Error: " + ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
            return toReturn;

        }

        public static RawKlagesagData Insert(int gammelt_klagesagsnr, string ejerFirma, string coEjer, string ejerPostNr, string ejerBy, string title, string ejerKontakt, string kundeTelefon,
            string ejerEmail, int potentiale, RawSagsType sagsType, string bemærkning, string connStr)
        {
            var toReturn = new RawKlagesagData
            {
                        gammelt_Klagesagsnr = gammelt_klagesagsnr,          
                        ejerFirma = ejerFirma,
                        coEjer = coEjer,
                        ejerPostNr = ejerPostNr,
                        ejerBy = ejerBy,
                        title = title,
                        ejerKontakt = ejerKontakt,
                        kundeTelefon = kundeTelefon,
                        ejerEmail = ejerEmail,
                        potentiale = potentiale,
                        sagsType = sagsType,
                        bemærkning = bemærkning
            };
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    var sqlCommand = new SqlCommand("insert into KlageSag (Gammelt_Klagesagsnr, Ejer_Firma, [co/ejer], Ejer_Postnr, Ejer_By, Titel, Ejer_Kontakt, Kunde_Telefon, Ejer_Email, Potentiale, Sagstype, Bemærkning) VALUES (@gammeltKlagesagsnr, @ejerFirma, @coEjer, @ejerPostNr, @ejerBy, @title, @ejerKontakt, @kundeTelefon, @ejerEmail, @potentiale, @sagsType, @bemærkning)", conn);

                    sqlCommand.Parameters.Add("@gammeltKlagesagsnr", SqlDbType.Int);
                    sqlCommand.Parameters.Add("@ejerFirma", SqlDbType.VarChar, 250); 
                    sqlCommand.Parameters.Add("@coEjer", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerPostNr", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerBy", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@title", SqlDbType.VarChar, 250); 
                    sqlCommand.Parameters.Add("@ejerKontakt", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@kundeTelefon", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerEmail", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@potentiale", SqlDbType.Int);
                    sqlCommand.Parameters.Add("@sagsType", SqlDbType.Int);
                    sqlCommand.Parameters.Add("@bemærkning", SqlDbType.VarChar, 250);

                    sqlCommand.Parameters["@gammeltKlagesagsnr"].Value = toReturn.gammelt_Klagesagsnr;
                    sqlCommand.Parameters["@ejerFirma"].Value = toReturn.ejerFirma;
                    sqlCommand.Parameters["@coEjer"].Value = toReturn.coEjer;
                    sqlCommand.Parameters["@ejerPostNr"].Value = toReturn.ejerPostNr;
                    sqlCommand.Parameters["@ejerBy"].Value = toReturn.ejerBy;
                    sqlCommand.Parameters["@title"].Value = toReturn.title;
                    sqlCommand.Parameters["@ejerKontakt"].Value = toReturn.ejerKontakt;
                    sqlCommand.Parameters["@kundeTelefon"].Value = toReturn.kundeTelefon;
                    sqlCommand.Parameters["@ejerEmail"].Value = toReturn.ejerEmail;
                    sqlCommand.Parameters["@potentiale"].Value = toReturn.potentiale;
                    sqlCommand.Parameters["@sagsType"].Value = (int) toReturn.sagsType;
                    sqlCommand.Parameters["@bemærkning"].Value = toReturn.bemærkning;

                    var sqlReader = sqlCommand.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
                finally
                {
                    conn.Close();
                }
            }
            return toReturn;

        }

        public void Save(string connStr)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                try
                {
                    conn.Open();
                    var sqlCommand = new SqlCommand("update KlageSag set Ejer_Firma = @ejerFirma, [co/ejer] = @coEjer, Ejer_Postnr = @ejerPostNr, Ejer_By = @ejerBy, Titel = @title, Ejer_Kontakt = @ejerKontakt, Kunde_Telefon = @kundeTelefon, Ejer_Email = @ejerEmail, Potentiale = @potentiale, Sagstype = @sagsType, Bemærkning = @bemærkning where Gammelt_Klagesagsnr = @gammeltKlagesagsnr", conn);

                    sqlCommand.Parameters.Add("@gammeltKlagesagsnr", SqlDbType.Int);
                    sqlCommand.Parameters.Add("@ejerFirma", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@coEjer", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerPostNr", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerBy", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@title", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerKontakt", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@kundeTelefon", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@ejerEmail", SqlDbType.VarChar, 250);
                    sqlCommand.Parameters.Add("@potentiale", SqlDbType.Int);
                    sqlCommand.Parameters.Add("@sagsType", SqlDbType.Int);
                    sqlCommand.Parameters.Add("@bemærkning", SqlDbType.VarChar, 250);

                    sqlCommand.Parameters["@gammeltKlagesagsnr"].Value = gammelt_Klagesagsnr;
                    sqlCommand.Parameters["@ejerFirma"].Value = ejerFirma;
                    sqlCommand.Parameters["@coEjer"].Value = coEjer;
                    sqlCommand.Parameters["@ejerPostNr"].Value = ejerPostNr;
                    sqlCommand.Parameters["@ejerBy"].Value = ejerBy;
                    sqlCommand.Parameters["@title"].Value = title;
                    sqlCommand.Parameters["@ejerKontakt"].Value = ejerKontakt;
                    sqlCommand.Parameters["@kundeTelefon"].Value = kundeTelefon;
                    sqlCommand.Parameters["@ejerEmail"].Value = ejerEmail;
                    sqlCommand.Parameters["@potentiale"].Value = potentiale;
                    sqlCommand.Parameters["@sagsType"].Value = (int)sagsType;
                    sqlCommand.Parameters["@bemærkning"].Value = bemærkning;

                    var sqlReader = sqlCommand.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
                finally
                {
                    conn.Close();
                }
            }
        }

        private static string getNullableString(SqlDataReader sqlReader, int no)
        {
            if (sqlReader.IsDBNull(no))
                return "";
            else
                return sqlReader.GetString(no);
        }
        private static int getNullableInt(SqlDataReader sqlReader, int no)
        {
            if (sqlReader.IsDBNull(no))
                return 0;
            else
                return sqlReader.GetInt32(no);
        }

    }

    public enum RawSagsType
    {
        Tom = 1,
        Klag_EV_2010 = 2,
        Klag_EV_2008 = 3,
        Klag_EV_2012 = 4,
        Genåbn_EV_2006 = 5,
        Genåbn_EV_2008 = 6,
        Genåbn_EV_2010 = 7,
        Fritag_GS = 8,
        Fritag_DA = 9,
        Fritag_GS_plus_DA = 10,
        Nedsæt_leje = 11,
        Fradrag_i_GV = 12,
        Fredet_ejendom = 13
    }
}
